home *** CD-ROM | disk | FTP | other *** search
- {
- The following code shows how to create a temporary stack
- for use during ISRs and in other situations where the
- default stack might not be big enough.
-
- The following program intentionally creates a very small
- default stack by using the $M compiler directive. It then
- calls a function which pushes $2000 bytes onto the stack,
- thereby setting up a situation which should cause a 202 error.
-
- To avoid the error, the program creates a temporary stack
- by allocating $4000 bytes on the heap and moving this value
- into SS. It then sets SP to point at the end of this new
- stack and proceeds to call the function, which does not
- fail because of the new temporary stack.
-
- This code has been tested in both real and protected mode.
- }
-
-
- {$M $800, 0, $12000}
-
- procedure BreakDefaultStack;
- var
- a:array[0..$2000] of char;
- begin
- Writeln('Hello');
- end;
-
- var
- aSS, aSP: Word;
- Stck: pointer;
-
- begin
- getmem(Stck, $4000);
- Word (Stck^) := 1;
-
- asm
- mov aSP, sp
- mov ax, ss
- mov aSS, ax
- mov ax, word ptr [Stck]
- mov bx, word ptr [stck+2]
- add ax, $4000-2
- cli
- mov ss, bx
- mov sp, ax
- sti
- end;
-
- BreakDefaultStack;
-
- asm
- mov ax, aSS
- mov ss, ax
- mov sp, aSP
- end;
-
- freemem(Stck, $4000);
- end.